package com.sh.rbac.core.common.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

 /** 
 * @since 2024-03-03 12:34
 * <p>
 * jwt 工具类
 */
public class JwtUtils {

    // 过期时间
    //private static final Long EXPIRE_TIME = 15 * 60 * 1000L; // 15分钟
    // 加密密钥
    private static final String SECRET = "my_secret";

     /**    * 创建 token
     *
     * @param claimMap 载体
     * @return token
     */
    public static String createToken(Map<String, String> claimMap, long expireTime) {
        // 过期时间=当前时间加设定时间
        Date expiration = new Date(System.currentTimeMillis() + expireTime);

        // 设置 JWT 头部
        Map<String, Object> map = new HashMap<>();
        map.put("typ", "JWT");
        map.put("alg", "HS256");

        // 创建 token
        JWTCreator.Builder builder = JWT.create();

        // 创建 payload 载体
        claimMap.forEach(builder::withClaim);

        // 生成 token
        return builder.withHeader(map)      // 设置头部
                .withExpiresAt(expiration)  // 设置过期时间
                .sign(Algorithm.HMAC256(SECRET)); // 设置签名解密算法
    }


     /**    * 验证 token
     *
     * @param token token
     * @return 解密后的 token
     */
    public static DecodedJWT verifyToken(String token) {
        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }


     /**
      * 截取 Bearer
      */
    public static String getToken(String authorization) {
        return authorization.substring(7);
    }

    public static void main(String[] args) {
        System.out.println("========== 加密 token ==========");
        Map<String, String> map = new HashMap<>();
        map.put("username", "admin");
        map.put("password", "123456");
        String token = createToken(map, 15 * 60 * 1000L);
        System.out.println(token);

        System.out.println("\n========== 解密 token ==========");
        DecodedJWT decoded = verifyToken(token);
        decoded.getClaims().forEach((k, v) -> System.out.println(k + ": " + v));
    }
}
